package com.doctcloud.hisinfo.common.config;

import org.springframework.stereotype.Component;

import javax.annotation.PreDestroy;
import java.lang.reflect.Method;

@Component
public class OracleThreadShutdownHandler {

    /**
     * 应用关闭前执行：通过反射停止 Oracle 私有线程
     */
    @PreDestroy
    public void shutdownOracleThreads() {
        try {
            // 1. 加载 Oracle 超时轮询线程类（包内私有类，只能通过全类名反射加载）
            Class<?> threadClass = Class.forName("oracle.jdbc.driver.OracleTimeoutPollingThread");

            // 2. 反射获取单例实例（私有静态方法 getInstance()）
            Method getInstanceMethod = threadClass.getDeclaredMethod("getInstance");
            getInstanceMethod.setAccessible(true); // 允许访问私有方法
            Object threadInstance = getInstanceMethod.invoke(null); // 静态方法无实例，传 null

            if (threadInstance != null) {
                // 3. 反射调用 stop() 方法停止线程（私有方法）
                Method stopMethod = threadClass.getDeclaredMethod("stop");
                stopMethod.setAccessible(true); // 允许访问私有方法
                stopMethod.invoke(threadInstance);
                System.out.println("OracleTimeoutPollingThread 已通过反射停止");
            }
        } catch (ClassNotFoundException e) {
            // 兼容：若驱动版本不同，该类可能不存在，忽略即可
            System.out.println("未找到 OracleTimeoutPollingThread 类，忽略停止操作");
        } catch (NoSuchMethodException e) {
            System.err.println("Oracle 线程方法不存在，可能驱动版本不匹配：" + e.getMessage());
        } catch (Exception e) {
            System.err.println("停止 Oracle 线程失败：" + e.getMessage());
        }
    }
}